/*------------------------------------------------------------------------
//                          Project CommonLib                           //
------------------------------------------------------------------------*/

#pragma once

#include <crtdbg.h>
#define MAX_ASSERT_MSG_SIZE 2048

 void AssertFailMsg( const UINT32& line, TCHAR* pFunc, TCHAR *pFile, TCHAR* format, ...);
 void AssertMsg(bool checkAssert, TCHAR* exp, const UINT32& line, TCHAR* pFunc, TCHAR *pFile, TCHAR* format, ...); 

//////////////////////////////////////////////////////////////////////////
// AssertMsgFunc
//////////////////////////////////////////////////////////////////////////
extern  bool AssertMsgFunc(const TCHAR *exp,const TCHAR *desc, const TCHAR *func, const TCHAR *file, const int& line);
extern  int AssertMessageBox();

extern  void __AsmBreak();

//////////////////////////////////////////////////////////////////////////
// Debug 
#define CmASSERT_D( exp ) \
	   	   { \
	   	   	   static bool askedtoignore	  = false; \
	   	   	   static bool invokeagain		   = true; \
	   	   	   if( !(exp) && invokeagain ) \
	   	   	   { \
               if( true==AssertMsgFunc( TEXT(#exp), NULL, __FUNCTIONW__, TEXT(__FILE__), __LINE__ ) ) \
	   	   	   	   { \
						__AsmBreak();	\
	   	   	   	   } \
	   	   	   	   if( !askedtoignore ) \
	   	   	   	   { \
	   	   	   	   	   if( IDYES==AssertMessageBox() ) \
	   	   	   	   	   { \
	   	   	   	   	   	   invokeagain = true; \
	   	   	   	   	   } \
	   	   	   	   	   else \
	   	   	   	   	   { \
	   	   	   	   	   	   askedtoignore = true; \
	   	   	   	   	   	   invokeagain = false; \
	   	   	   	   	   } \
	   	   	   	   } \
	   	   	   } \
	   	   }

/*------------------------------------------------------------------------

------------------------------------------------------------------------*/
